package com.ceuer.pet.dao.impl;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.List;

/**
 * 连接数据库的各种操作的父类
 * 1、获取数据库连接对象---Connection
 * 2、增加、删除和修改的通用方法（不要求必须理解）
 * 3、处理数据库连接的各种对象关闭的方法
 */
public class BaseDao {
	
	/**
	 * 获取数据库的连接对象
	 * @return Connection
	 */
	public Connection getConn() throws Exception {
		//mysql的驱动地址
		String driver="com.mysql.cj.jdbc.Driver";
		//连接mysql数据库的字符串
		String url="jdbc:mysql://127.0.0.1:3306/pet";
		//mysql数据库账户root账户是最高权限
		String user="root";
		//root账户的密码
		String password="root";//password
		
		//注册数据库驱动(检查一下我们连接数据库的这个mysql驱动包的地址是否存在)
		Class.forName(driver);
		
		//DriverManager来获取Connection这个连接对象
		Connection conn= DriverManager.getConnection(url, user, password);
		
		return conn;
	}
	
	/**
	 * 增加、修改和删除操作的通用方法
	 * @param sql 要执行的sql语句,通常就是参数是?的形式
	 * @param param 封装了要执行sql语句参数的数组
	 * @return int
	 */
	public int executeUpdate(String sql, List<Object> param){
		int result=0;
		Connection conn=null;//定义数据库连接对象
		PreparedStatement pst=null;//定义sql语句的预编译和处理对象
		try{
			//获取数据库连接对象
			conn=this.getConn();
			//获取sql的预编译对象
			pst=conn.prepareStatement(sql);
			
			//判断这个Object数组是否是null，并且长度是否是为0
			if(param!=null && param.size()>0){
				for (int i = 0; i < param.size(); i++) {
					pst.setObject((i+1), param.get(i));
				}
			}
			
			//执行sql，并获取受影响的记录数
			result=pst.executeUpdate();
		}catch (Exception e){
			e.printStackTrace();
		}finally {
			this.closeAll(conn, pst, null);
		}
		return result;
	}
	
	/**
	 * 关闭数据库连接对象的通用方法
	 * @param conn 数据库连接对象
	 * @param pst 预编译sql并执行sql语句的对象
	 * @param rs 结果集对象(只有在查询的时候使用)
	 */
	public void closeAll(Connection conn,PreparedStatement pst, ResultSet rs){
		try {
			//1、如果rs不是null，那么关闭
			if(rs!=null) {rs.close();}
			//2、如果pst不是null，那么关闭
			if(pst!=null) {pst.close();}
			//3、如果conn不是null，那么关闭
			if(conn!=null) {conn.close();}
		}catch (Exception e){
			e.printStackTrace();
		}
	}
}
